package com.zqh.template.filter;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import com.zqh.template.enums.FileFilterRangeEnum;
import com.zqh.template.enums.FileFilterRuleEnum;
import com.zqh.template.model.FileFilterConfig;

import java.io.File;
import java.util.List;
import java.util.stream.Collectors;


public class FileFilter {

    /*
     * @description: 单个文件过滤
     * @params: [fileFilterConfigList 过滤规则, file 单个文件]
     * @return: boolean  是否保留
     * @author: zqh
     * @dateTime: 2025/2/14 21:08
     */



    public static boolean doSingleFileFilter(List<FileFilterConfig> fileFilterConfigList, File file){


        String fileName = file.getName();
        String fileContent = FileUtil.readUtf8String(file);

        // 所有过滤器检验结束的结果
        boolean result = true;

        // 集合为空
        if(CollUtil.isEmpty(fileFilterConfigList)) return true;


        // 遍历规则，范围以及过滤值，不满足就反悔false
        for(FileFilterConfig fileFilterConfig : fileFilterConfigList){


            String range = fileFilterConfig.getRange();// 过滤范围，文件目录还是文件
            String rule = fileFilterConfig.getRule();// 用匹配规则过滤
            String value = fileFilterConfig.getValue();  // 过滤的值


            FileFilterRangeEnum fileFilterRangeEnum = FileFilterRangeEnum.getEnumByValue(range);

            // 如果枚举不存在这种范围，则不考虑
            if(fileFilterRangeEnum == null) continue;

            // 要过滤的文件还是文件目录
            String content = fileName;
            switch (fileFilterRangeEnum){
                case FILE_NAME:
                    content  = fileName;
                    break;
                case FILE_CONTENT:
                    content = fileContent;
                    break;
                default:
            }


            FileFilterRuleEnum fileFilterRuleEnum = FileFilterRuleEnum.getEnumByValue(rule);

            // 如果不存在这种规则，则可以这个文件不考虑
            if(fileFilterRuleEnum == null) continue;

            switch (fileFilterRuleEnum){
                case CONTAINS:
                    result =  content.contains(value);
                    break;
                case STARTS_WITH:
                    result = content.startsWith(value);
                    break;
                case REGEX:
                    result = content.matches(value);
                    break;
                case EQUALS:
                    result = content.equals(value);
                    break;
                case ENDS_WITH:
                    result = content.endsWith(value);
                    break;
                default:
            }

            // 如果有一个不满足，就直接返回
            if(!result) return  false;

        }

        return true;
    }


    /*
     * @description: 对文件目录进行过滤，返回文件列表
     * @params: [filePath, fileFilterConfigList]
     * @return: java.util.List<java.io.File>
     * @author: zqh
     * @dateTime: 2025/2/15 20:59
     */

    public static List<File>  doFilter(String filePath, List<FileFilterConfig> fileFilterConfigList){
        List<File>  fileList =  FileUtil
                .loopFiles(filePath)
                .stream()
                // 符合条件的路径留下了
                .filter(file -> doSingleFileFilter(fileFilterConfigList, file))
                .collect(Collectors.toList());

        return fileList;
    }

}
